package mx.frantor.catalogos.daoimp;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import mx.frantor.catalogos.dao.MateriaPrimaExistenciasDAO;
import mx.frantor.catalogos.entitys.InventariomateriasPrimasEntity;
import mx.frantor.catalogos.entitys.MateriaPrimaExistenciasEntity;
import mx.frantor.util.HibernateUtil;

public class MateriaPrimaExistenciasDAOImpl implements
		MateriaPrimaExistenciasDAO {

	@Override
	public String agregarMateriaPrimaExistencias(
			MateriaPrimaExistenciasEntity nuevoMateriaPrimaExistencias) {
			String e = "";
			Session session = HibernateUtil.getSessionFactory()
					.getCurrentSession();
			
			session.beginTransaction();
			try {
			session.save(nuevoMateriaPrimaExistencias);
			session.flush();
			session.getTransaction().commit();
			e = nuevoMateriaPrimaExistencias.getIdMateria().toString();
			} catch (Exception x) {
				//e.printStackTrace();
				session.getTransaction().rollback();
				e = x.getMessage();
				//return e.toString();
			}
			HibernateUtil.getSessionFactory().getCurrentSession().close();

			System.out.println("agregar mat prima exist resultado " + e);

			return e;
	}

	@Override
	public String modificarMateriaPrimaExistencias(
			MateriaPrimaExistenciasEntity modificaMateriaPrimaExistencias) {
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
	
		session.beginTransaction();
		try {
			MateriaPrimaExistenciasEntity MPExistenciaTemp = (MateriaPrimaExistenciasEntity) session.get(
					MateriaPrimaExistenciasEntity.class, modificaMateriaPrimaExistencias.getIdMateria());
		session.flush();
		session.evict(MPExistenciaTemp);
		session.update(modificaMateriaPrimaExistencias);
		session.getTransaction().commit();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();
			//return e.toString();
		}
		
		HibernateUtil.getSessionFactory().getCurrentSession().close();

		System.out.println("modificar mat prima exist resultado " + e);

		return e;
	}

	@Override
	public String eliminarMateriaPrimaExistencias(
			Long idMateriaMateriaPrimaExistencias) {
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		

			// TODO Auto-generated method stub			
			session.beginTransaction();
			try {
				MateriaPrimaExistenciasEntity inventarioMpElimina = (MateriaPrimaExistenciasEntity) session.get(
						MateriaPrimaExistenciasEntity.class, idMateriaMateriaPrimaExistencias);
			session.delete(inventarioMpElimina);
			session.getTransaction().commit();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();
			//return e.toString();
		}
		//HibernateUtil.getSessionFactory().getCurrentSession().close();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		System.out.println("eliminar mat prima exist resultado " + e);

		return e;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<MateriaPrimaExistenciasEntity> getTodosMateriaPrimaExistenciasActivos() {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<MateriaPrimaExistenciasEntity> InventarioMP = session.createCriteria(MateriaPrimaExistenciasEntity.class).list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return InventarioMP;
	}

	@SuppressWarnings("unchecked")
	@Override
	public MateriaPrimaExistenciasEntity getMateriaPrimaExistenciasId(
			Long idPrimaExistencias) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<MateriaPrimaExistenciasEntity> inventarioMP = (List<MateriaPrimaExistenciasEntity>) session.createCriteria(MateriaPrimaExistenciasEntity.class)
				.add(Restrictions.eq("IdMateria", idPrimaExistencias))
				.setFetchSize(1).list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		if(inventarioMP==null){
			return null;
		}else{
			return inventarioMP.get(0);
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<MateriaPrimaExistenciasEntity> getMateriaPrimaExistenciasPorId(
			Long idMateriaPrimaExistencias) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<MateriaPrimaExistenciasEntity> InventarioMP = (List<MateriaPrimaExistenciasEntity>) session.createCriteria(MateriaPrimaExistenciasEntity.class)
				.add(Restrictions.eq("IdMateria", idMateriaPrimaExistencias))
				.list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return InventarioMP;
	}

	@Override
	public MateriaPrimaExistenciasEntity getMateriaPrimaExistenciasPorClave(
			String clave) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		@SuppressWarnings("unchecked")
		List<MateriaPrimaExistenciasEntity> list = session.createCriteria(MateriaPrimaExistenciasEntity.class)
			.add(Restrictions.eq("Clave", clave)).list();
		session.getSessionFactory().getCurrentSession().close();
		try{
			return list.get(0);
		}catch(Exception err){
			return null;
		}
	}

	@Override
	public String modificarMateriaPrimaCantidad(Long idMateria, Float cantidad) {
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
	
		session.beginTransaction();
		try {
			MateriaPrimaExistenciasEntity MPExistenciaTemp = (MateriaPrimaExistenciasEntity) session.get(
					MateriaPrimaExistenciasEntity.class, idMateria);
		session.flush();
		session.evict(MPExistenciaTemp);
		MPExistenciaTemp.setCantidad(MPExistenciaTemp.getCantidad()+cantidad);
		session.update(MPExistenciaTemp);
		session.getTransaction().commit();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();
			//return e.toString();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();

		return e;
	}
	
	@Override
	public String restarMateriaPrimaCantidad(Long idMateria, Float cantidad) {
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
	
		session.beginTransaction();
		try {
			MateriaPrimaExistenciasEntity MPExistenciaTemp = (MateriaPrimaExistenciasEntity) session.get(
					MateriaPrimaExistenciasEntity.class, idMateria);
		session.flush();
		session.evict(MPExistenciaTemp);
		MPExistenciaTemp.setCantidad(MPExistenciaTemp.getCantidad()+cantidad);
		session.update(MPExistenciaTemp);
		session.getTransaction().commit();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();
			//return e.toString();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();

		return e;
	}
	@SuppressWarnings("unchecked")
	@Override
	public List<MateriaPrimaExistenciasEntity> getStock(){
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<MateriaPrimaExistenciasEntity> materia = (List<MateriaPrimaExistenciasEntity>) session.createCriteria(MateriaPrimaExistenciasEntity.class)
				.add(Restrictions.leProperty("Cantidad", "Minimo"))
				.list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return materia;
	}
}
